# 装饰器模式
# => ⭐动态地给一个对象添加额外的职责。
# => ⭐可用装饰来对对象进行无限次的封装。例如流式加载


# 装饰器模式结构中包含如下角色：
# 1. Component（组件）：定义一个对象接口。
# 2. ConcreteComponent（具体组件）：实现了Component接口，定义一个对象。
# 3. Decorator（装饰器）：持有一个Component的实例，并定义一个与Component接口一致的接口。
# 4. ConcreteDecorator（具体装饰器）：实现Decorator接口，并持有一个Component的实例，并定义一个与Component接口一致的接口。
# 5. Client（客户端）：使用装饰器来装饰一个对象，并调用其方法。

from abc import ABCMeta, abstractmethod

class Component(metaclass=ABCMeta):
    @abstractmethod
    def operation(self):
        pass

class ConcreteComponent(Component):
    def operation(self):
        print("ConcreteComponent operation")

class Decorator(Component):
    def __init__(self, component):
        self.component = component

    def operation(self):
        self.component.operation()

class ConcreteDecoratorA(Decorator):
    def operation(self):
        print("ConcreteDecoratorA operation")
        super().operation()

class ConcreteDecoratorB(Decorator):
    def operation(self):
        print("ConcreteDecoratorB operation")
        super().operation()

if __name__ == "__main__":
    component = ConcreteComponent()
    decorator1 = ConcreteDecoratorA(component)
    decorator2 = ConcreteDecoratorB(decorator1)
    decorator2.operation()
    # Output: ConcreteDecoratorB operation
    #         ConcreteDecoratorA operation
    #         ConcreteComponent operation
